package com.github.yelisheng.annotation;

import com.github.yelisheng.constant.QueryStatic;
import com.github.yelisheng.constant.QueryType;

import java.lang.annotation.*;

/**
 * MyBatis Plus 动态查询条件注解
 * <p>
 * 通过在实体类字段上添加此注解，可自动生成对应的查询条件
 * </p>
 *
 * @author 叶璃笙
 * @since 1.0.0
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MpQuery {

    /**
     * 表前缀 (默认: "t")
     * <p>示例1: prefix = "u" → 生成条件: u.username = 'admin'</p>
     * <p>示例2: prefix = ""  → 生成条件: username = 'admin'</p>
     *
     * @return 表前缀
     */
    String prefix() default QueryStatic.DEFAULT_TABLE_PREFIX;

    /**
     * 查询类型 (默认: 等于)
     * <p>示例1: type = QueryType.LIKE → 模糊查询</p>
     * <p>示例2: type = QueryType.GT  → 大于条件</p>
     *
     * @return 查询类型枚举
     */
    QueryType type() default QueryType.EQ;

    /**
     * 自定义字段名（当实体字段与数据库列名不一致时使用）
     * <p>示例1: field = "user_name" → 将Java字段映射到数据库user_name列</p>
     * <p>示例2: field = "createTime" → 使用自定义字段名</p>
     *
     * @return 数据库字段名
     */
    String field() default "";

    /**
     * 默认值（当字段值为null时生效）
     * <p>示例1: defaultValue = "0" → 空值转为0</p>
     * <p>示例2: defaultValue = "N/A" → 空值转为"N/A"</p>
     *
     * @return 默认值字符串
     */
    String defaultValue() default "";

    /**
     * 自定义条件表达式（支持SpEL表达式）
     * <p>示例1: condition = "price > #{value}" → 生成条件: price > 100</p>
     * <p>示例2: condition = "status = #{value} OR is_deleted = 0"</p>
     *
     * @return SQL条件表达式
     */
    String condition() default "";

    /**
     * 排序规则（多个条件用逗号分隔）
     * <p>示例1: orderBy = "create_time:DESC" → 按创建时间降序</p>
     * <p>示例2: orderBy = "name:ASC,age:DESC" → 先按姓名升序，再按年龄降序</p>
     *
     * @return 排序字段及方向
     */
    String orderBy() default "";

    /**
     * 分组字段（多个字段用逗号分隔）
     * <p>示例1: groupBy = "department" → GROUP BY department</p>
     * <p>示例2: groupBy = "year,month" → GROUP BY year, month</p>
     *
     * @return 分组字段列表
     */
    String groupBy() default "";

    /**
     * 条件参数（用于替换condition中的占位符）
     * <p>示例: 
     *   condition = "date BETWEEN {start} AND {end}",
     *   conditionParams = {"#{value}-30", "#{value}"}
     *   → 生成条件: date BETWEEN (sysdate-30) AND sysdate
     * </p>
     *
     * @return 参数数组
     */
    String[] conditionParams() default {};
}